package top.hekun.study.core;

import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.util.Printer;

import java.util.ArrayList;
import java.util.List;

/**
 * 〈type类 示例〉
 *
 * @author: Sakura
 * @date: 2023/5/9
 */
public class TypeDemo {
    public static void main(String[] args) {
        // void 标识
        List<Type> typeList = new ArrayList<>(9);
        typeList.add( Type.VOID_TYPE);
        typeList.add( Type.BOOLEAN_TYPE);
        typeList.add( Type.CHAR_TYPE);
        typeList.add( Type.BYTE_TYPE);
        typeList.add( Type.SHORT_TYPE);
        typeList.add( Type.INT_TYPE);
        typeList.add( Type.FLOAT_TYPE);
        typeList.add( Type.LONG_TYPE);
        typeList.add( Type.DOUBLE_TYPE);
        System.out.println(typeList);
        // 通过类标识获取 标识
        {
        Type type = Type.getType(String.class);
        System.out.println(type);
        // 对应的是 org.objectweb.asm.Type.OBJECT
        System.out.println(type.getSort());
        // 获取类名称 java.lang.String  分割符号 是(.)
        System.out.println(type.getClassName());
        // 获取内部名称  java/lang/String   分割符号 是(/)
        System.out.println(type.getInternalName());
        // 获取描述忽悠 Ljava/lang/String;    分割符号 是(/)
        System.out.println(type.getDescriptor());
        System.out.println("**************************");
        }

        {
            // 通过 字符串 (类型描述符) 获取 类型
            Type type = Type.getType("Ljava/lang/String;");
            System.out.println(type);
            // 对应的是 org.objectweb.asm.Type.OBJECT
            System.out.println(type.getSort());
            // 获取类名称 java.lang.String  分割符号 是(.)
            System.out.println(type.getClassName());
            // 获取内部名称  java/lang/String   分割符号 是(/)
            System.out.println(type.getInternalName());
            // 获取描述忽悠 Ljava/lang/String;    分割符号 是(/) 前面有(L) 后面有(;)
            System.out.println(type.getDescriptor());
            System.out.println("**************************");
        }
        {
            Type type = Type.FLOAT_TYPE;

            int newOpcode = type.getOpcode(Opcodes.IADD);
            String opcode0 = Printer.OPCODES[Opcodes.IADD];
            String opcode1 = Printer.OPCODES[newOpcode];
            System.out.println(opcode0);
            System.out.println(opcode1);

        }

    }
}
